﻿
#include "stdafx.h"
#include "GHCY.h"
#include "Floors.h"
#include "DlgFloor.h"

// 楼层参数

Floors afxFloors;

#ifdef _DEBUG
	#define new DEBUG_NEW
#endif

/// <作者>Mr. Hu</作者>
/// <日期>20241117</日期>
/// <功能>析构函数</功能>
/// <参数 name = ""></参数>
/// <返回></返回>
/// <说明></说明>
//Floor();
//Floor::~Floor()
//{
//	// 在这里delete报错
//	//if (pMatrix)
//	//	delete pMatrix;
//}

/// <作者>Mr. Hu</作者>
/// <日期>20241117</日期>
/// <功能>设置转换矩阵</功能>
/// <参数 name = ""></参数>
/// <返回></返回>
/// <说明></说明>
void Floor::setMatrix()
{
	mtxMap2Agv =
		D2D1::Matrix3x2F::Rotation(fA)		// 以节点为中心转到车身角度
		* D2D1::Matrix3x2F::Translation(fX, fY)	// 磁点移到当前节点位置
		;
	mtxAgv2Map = mtxMap2Agv;
	mtxMap2Agv.Invert();
}


//==============================================

/// <作者>Mr. Hu</作者>
/// <日期>20241117</日期>
/// <功能>析构函数</功能>
/// <参数 name = ""></参数>
/// <返回></返回>
/// <说明></说明>
//Floor();
//Floors::~Floors()
//{
//	//delete m_floors[1].pMatrix;
//	//delete m_floors[3].pMatrix;
//
//	for (size_t i = 0; i < MAXFLOOR; i++)
//	{
//		D2D1::Matrix3x2F* pf = m_floors[i].pMatrix;
//		if (pf)
//		{
//			delete pf;
//		}
//	}
//}

/// <作者>Mr. Hu</作者>
/// <日期>20241116</日期>
/// <功能>从数据载入楼层参数</功能>
/// <参数 name = ""></参数>
/// <返回></返回>
/// <说明></说明>
void Floors::loadFloors()
{
	clearFloors();

	CString strsql = L"SELECT `id`, `xMap`, `yMap`, `aMap`, `floor` FROM `floors`;";
	HRecordset rs(theApp.getDatabase());
	rs.Open2(strsql);

	// 取表的字段名
	//CODBCFieldInfo fi;
	//rs.GetODBCFieldInfo( (short)5, fi );

	CDBVariant var;	// var 要释放
	for (int i = 0; !rs.IsEOF(); i++)
	{
		Floor floor;

		// 读数据 ?? 异常
		// id
		rs.GetFieldValue((short)0, var);
		floor.nID = var.m_lVal;
		// 地图变化x
		rs.GetFieldValue((short)1, var);
		floor.fX = (float)var.m_dblVal;
		// 地图变化y
		rs.GetFieldValue((short)2, var);
		floor.fY = (float)var.m_dblVal;
		// 地图变化angle
		rs.GetFieldValue((short)3, var);
		floor.fA = (float)var.m_dblVal;
		// 楼层
		rs.GetFieldValue((short)4, var);
		floor.nFloor = var.m_lVal;

		if (floor.nFloor >= MAXFLOOR)
			AfxMessageBox(L"楼层超过255");
		else
		{
			floor.setMatrix();
			m_arrFloors.Add(floor);
			m_bufFloors[floor.nFloor] = (UINT8)i;
		}

		rs.MoveNext();
	}
	var.Clear();	// var 要释放
	rs.Close();
	m_nCount = m_arrFloors.GetCount();
}

/// <作者>Mr. Hu</作者>
/// <日期>20241116</日期>
/// <功能>获取楼层参数</功能>
/// <参数 name = "nFloor">层号，从0-255</参数>
/// <返回>成功时返回层参数指针，否则返回0</返回>
/// <说明></说明>
Floor* Floors::getFloor(UINT32 nFloor)
{
	if (nFloor >= MAXFLOOR)
		return 0;

	UINT8 nn = m_bufFloors[nFloor];
	if (nn == 0xff)
		return 0;

	ASSERT(nn < m_nCount);

	return &m_arrFloors[nn];
}

/// <作者>Mr. Hu</作者>
/// <日期>20241117</日期>
/// <功能>设置楼层参数</功能>
/// <参数 name = ""></参数>
/// <返回>成功时返回层参数指针，否则返回0</返回>
/// <说明></说明>
void Floors::adjust()
{
	DlgFloor dlg;
	if(dlg.DoModal() != IDOK)
		return;
/*
	int nFloor = dlg.m_nSerect + 1;
	CArray<Car*>& cs = theApp.m_pGround->m_arrCars;
	Car* pCar = 0;
	for (size_t i = 0, length = cs.GetCount(); i < length; i++)
	{
		Car* pc = cs[i];
		if (pc->m_nFloor == nFloor)
		{
			pCar = pc;
			break;
		}
	}
	if (!pCar)
		return;
	CarData & cd = pCar->m_carData;

	Floor* pfl = afxFloors.getFloor(nFloor);
	pfl->fAgvX = cd.fX;
	pfl->fAgvY = cd.fY;
	pfl->fAgvA = cd.fRad * M_RAD1;

	CString strsql;
	strsql.Format(L"UPDATE `floors` set `xMap` = %g, `yMap` = %g, `aMap` = %g,"
		L" `xAgv` = %g, `yAgv` = %g, `aAgv` = %g WHERE `id` = %i;",
		pfl->fMapX, pfl->fMapY, pfl->fMapA, pfl->fAgvX, pfl->fAgvY, pfl->fAgvA, nFloor
	);
	theApp.getDatabase()->Execute(strsql);	// ?? 异常处理 	// 20201118合并成一条SQL

	// 求变换矩阵
	pfl->setMatrix();*/
}

/// <作者>Mr. Hu</作者>
/// <日期>20241120</日期>
/// <功能>设置转换矩阵</功能>
/// <参数 name = ""></参数>
/// <返回>1 成功，0 失败</返回>
/// <说明></说明>
//bool Floor::setMatrix()
//{
//	//CArray<Car*>& cs = theApp.m_pGround->m_arrCars;
//	//size_t length = cs.GetCount();
//	//ASSERT(nID);
//	//ASSERT(length);
//	//Car* pCar = 0;
//	//for (size_t i = 0; i < length; i++)
//	//{
//	//	Car* pc = cs[i];
//	//	if (pc->m_nFloor == nID)
//	//	{
//	//		pCar = pc;
//	//		break;
//	//	}
//	//}
//	//if (!pCar)
//	//	return 0;
//
//	//float fCarAngle = pCar->m_carData.fRad * M_RAD1;
//	float fx = fMapX;
//	float fy = fMapY;
//	float fa = fMapA;
//	m_mtxAgv2Map = D2D1::Matrix3x2F::Rotation(fa)						// 以节点为中心转到车身角度
//		* D2D1::Matrix3x2F::Translation(fx, fy)
//		;
//	m_mtxMap2Agv = m_mtxAgv2Map;
//	m_mtxMap2Agv.Invert();
//
//	return 1;
//}
